iT邦幫忙

2023 iThome 鐵人賽

DAY 4
1

如果每次部署的時候都要手動打包然後上傳到Lambda,實在不是一個聰明的方法,因此我們使用Github Action做為我們CI/CD的工具,如果是Github的一般用戶,一個月有2000分鐘的免費執行時間,其實也是足夠了。另外透過Github Action我們也能自動進行測試和檢核,之後串接codecov跟sonarcube來生成測試覆蓋率報告和做程式碼質量檢查。

1.建立AWS金鑰

首先為了能自動化操作AWS,所以我們要先拿到AWS的授權金鑰。登入AWS後,按右上角找到安全憑證
https://ithelp.ithome.com.tw/upload/images/20230919/20115990i1DZ9tM7gn.png
點擊建立存取金鑰,要記好[存取金鑰]&[私密存取金鑰],不然之後只能重新生成
https://ithelp.ithome.com.tw/upload/images/20230919/20115990CFY4RFUvJi.png

2.設定Github Action的Secrets

接著我們要把上一步拿到的兩個金鑰讓Github Action能調用,所以我們把專案放上github後,要將兩把金鑰存進專案內,首先到專案頁面→設定→secerts→action→[New repo secret],把上一步的[存取金鑰]&[私密存取金鑰]存進去AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
https://ithelp.ithome.com.tw/upload/images/20230919/20115990clfGADRuJI.png
這樣就存好摟~

由於Github Action的行為都是透過yml定義的,我們先在專案下新增.github\workflows\aws-lambda.yml
像下面這樣:
https://ithelp.ithome.com.tw/upload/images/20230919/20115990W6wE51VYXy.png
記得沒有.github\workflows這個路徑,要自己新增~

3.寫好yml檔

接著透過以下aws-lambda.yml的註解來了解Github Action的yml該如何撰寫,可以按照自己的需求調整這份yml就好了~

  • aws-lambda.yml

    name: Build and test Go & Deploy to Lambda # 工作流程的名稱
    on:   # 定義觸發工作流程的事件
      workflow_dispatch:  # 允許手動觸發工作流程
      push:   # 當push到github時觸發工作流程
        branches:   # 指定只有分支為"master"和"feature-*"會觸發
          - "master"
          - "feature-*"
      pull_request:   # 當有新的PR開起、同步或重開時會觸發工作流程
        types: [opened, synchronize, reopened]
        branches:   # 指定了觸發分支為"master"
          - "master"
    
    jobs:   # 定義工作流程中的不同的jobs
      Go-Test:  # jobs名稱 (用於測試)
        runs-on: ubuntu-latest  # 指定運行這個job的運行環境
        steps:  # 定義了一系列步驟,每個步驟執行一個特定的操作
          - name: Get project resource # 下載你的repo
            uses: actions/checkout@v3
            with:
              fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
    
          - name: Setup Go  # 設置Go環境
            uses: actions/setup-go@v4
            with:
              go-version: '1.21' # 指定使用Go版本為1.21
    
          - name: Run golangci-lint # 運行golangci-lint工具來進行Go代碼的靜態檢查
            uses: golangci/golangci-lint-action@v3
            # golangci-lint didn't merge below PR yet
            with: 
              version: v1.53
              args: --timeout 3m --verbose
            #   output-file: golangci-lint.out
    
    
      Deploy-to-Lambda: # 第二個工作,用於部署Go應用程序到AWS Lambda
        runs-on: ubuntu-latest
        needs: [Go-Test] # 依賴於Go-Test,只有在Go-Test這個job跑成功時才會執行(測試過後)
        if: ${{ github.ref == 'refs/heads/master'}} # 指定只有當GitHub分支為"master"時才運行這個job
        steps:
          - name: Configure AWS credentials # 設置AWS的身份驗證信息
            uses: aws-actions/configure-aws-credentials@v1-node16
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ap-northeast-1
          # 前面與Go-Test相同
          - name: Get project resource
            uses: actions/checkout@v3
    
          - name: Setup Go
            uses: actions/setup-go@v4
            with:
              go-version: '1.21' 
    
          # 跟昨天手動部署的流程相同
          - name: Build Lambda bootstrap
            run: |
              GOOS=linux GOARCH=amd64 go build -o bootstrap main.go
              zip bootstrap.zip bootstrap
              aws lambda update-function-code --function-name BaoSaveLineBot --zip-file fileb://bootstrap.zip
    

這樣只要當master有異動就會自動deploy到lambda上了,明天再來把codecov跟sonarcube加上去~


上一篇
Day03 前置準備-02(AWS Lambda+API Gateway)
下一篇
Day05 補上Codecov和SonarCloud
系列文
Golang LineBot X GoogleDrive:LINE有各種限制!? 那就丟上Drive吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言